home *** CD-ROM | disk | FTP | other *** search
/ Wildcat Files 2 / The Wildcat Files 2 (Arsenal Computer).ISO / casm / 3dsrc.zip next >
Text File  |  1994-12-03  |  34KB  |  1,354 lines

  1.   Hi folks, this is Tran typing... This is the virtual reality source from
  2. the Amnesia demo. It is not compilable because we make special provisions for
  3. our code. And because it has been so long since I wrote it, that even I would
  4. not attempt to compile this demo again. Oh well, but if you want to look, feel
  5. free. I had better explain a few things though:
  6.  
  7. ) This is all integer math, no IEEE floating points anywhere...
  8.  
  9. ) The SIN/COS table is merely a table of SIN/COS values for 512 points along
  10.    the curve scaled from -1.0 ... 1.0 floating to -512 ... 512 integer.
  11.  
  12. ) This thing loads external data, none of which is present here (or anywhere
  13.    in existance anymore for that matter)... So if something looks like its
  14.    missing, it probably is.
  15.  
  16. ) Ignore the stars, what you want is the solid temple thingy. If I remember
  17.    right, then here's how the sequence for that goes:
  18.  
  19.     ) All world coordinates are rotated and translated.
  20.     ) Facets are built from the world coordinates and clipped to a plane
  21.        at Z=5 at the same time.
  22.     ) The facets are sorted by a sortof distance from viewpoint thingy to
  23.        avoid having to take the square root. (Now that I think about it, why
  24.        didn't I just sort by dX^2+dY^2+dZ^2, I didn't have to take the sqrt).
  25.        The sort is in a byte indexed linked list to keep the data moves to a
  26.        minimum.
  27.     ) The thing is then projected.
  28.     ) Finally, all visible facets are drawn. Visibility is determined by
  29.        vektor cross products AFTER projection. (Dave's idea)
  30.  
  31. ) Keep in mind this is flat mem, so don't panic if U C big pointers that
  32.    even Windows would not allow and no seg overrides anywhere.
  33.  
  34.  
  35.   Oh well, thats all I remember I think. If you really want to learn, get a
  36. book. (A college textbook is best, you can then learn in a month what you
  37. would normally have to pay a few thousand dollars to get a piece of paper
  38. that says you know it in 4-6 years.)
  39.  
  40.   Ignore the SQRT routine down at the bottom, or use it, it is not part of
  41. the source, but I remember how hard it was for me to devise one, so here you
  42. go. (Oh yeah, this is integer too.)
  43.  
  44.  
  45. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  46. ; DATA
  47. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  48. P9S=60h         ; number of stars
  49. P9P=194         ; number of total points
  50. P9F=183         ; number of facets
  51. P9R=160         ; perspective multiplier
  52. P9C=5           ; cutoff Z loc
  53.  
  54. p9index         db      0
  55. p9matrix        dd      ?
  56. p9oldmatrix     dd      ?,?
  57. p9oldmatrixptr  dd      ?
  58. p9oldstarbuf    dd      ?,?
  59. p9oldstarptr    dd      ?
  60. p9page          db      40h
  61. p9pageptr       dd      ?
  62.  
  63. p9sincosptr     dd      ?               ; ptr to 512 degree sin/cos table
  64. p9starptr       dd      ?               ; misc XYZ star coordinates
  65. p9starcolorz    dd      ?               ; colors for stars
  66. p9vectptr       dd      ?               ; ptr to actual world coordinates
  67. p9facetptr      dd      ?               ; facet data for solid object
  68. p9facetnum      db      ?
  69. p9vbuf0         dd      ?               ; misc work buffer
  70. p9vbuf1         dd      ?               ; misc work buffer
  71. p9vbuf2         dd      ?               ; misc work buffer
  72.  
  73. p9vectoff       dw      0,0,25000, 0,0,0
  74. p9vectrot       dw      -84,0,0, 0,0,0
  75. p9distance      dw      0, 0
  76. p9moveparms     dd      ?
  77. p9movelen       dw      ?
  78. p9move          dw      ?,?,?, ?,?,?, ?
  79. p9count         dw      ?,?,?, ?,?,?, ?
  80. p9countdec      dw      ?,?,?, ?,?,?, ?
  81. p9movebyte      db      ?,?,?, ?,?,?, ?
  82. p9seqptr        dd      ?
  83. p9seq           dd      part9sequence
  84. p9delay         dw      ?
  85.  
  86. p9cubeptr       dd      ?
  87. p9cuberot       dw      0,0,0, -3,-4,-5
  88. p9phadein0      dd      part9phadein0
  89. p9phadein1      dd      part9phadein1
  90. p9phadeind      db      ?
  91.  
  92. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  93. ; CODE
  94. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  95.  
  96. ;═════════════════════════════════════════════════════════════════════════════
  97. part9:
  98.         mov _escpressed,0
  99.         call clearscreen
  100.         mov eax,9
  101.         call load
  102.  
  103.         mov edx,_lomembase
  104.         mov cx,30h
  105.         xor al,al
  106.         call setpalc
  107.         add edx,90h
  108.         mov p9sincosptr,edx
  109.         add edx,500h
  110.         mov p9starptr,edx
  111.         add edx,P9S*6
  112.         mov p9starcolorz,edx
  113.         add edx,P9S
  114.         movzx eax,word ptr [edx]
  115.         add eax,edx
  116.         mov p9seqptr,eax
  117.         add edx,2
  118.         mov p9cubeptr,edx
  119.         add edx,8*3*2
  120.         mov p9vectptr,edx
  121.         add edx,P9P*3*2
  122.         mov p9facetptr,edx
  123.  
  124.         lea ebp,[edx+8003h]
  125.         and ebp,0fffffffch
  126.         mov p9matrix,ebp
  127.         call _vinitedgebuf
  128.         add ebp,201*4
  129.         mov p9oldmatrix,ebp
  130.         call _vinitedgebuf
  131.         add ebp,201*4
  132.         mov p9oldmatrix[4],ebp
  133.         call _vinitedgebuf
  134.         add ebp,201*4
  135.         mov p9oldstarbuf,ebp
  136.         mov byte ptr [ebp],0
  137.         add ebp,P9S*2*2+1+3
  138.         mov p9oldstarbuf[4],ebp
  139.         mov byte ptr [ebp],0
  140.         add ebp,P9S*2*2+1+3
  141.         mov p9vbuf0,ebp
  142.         add ebp,8000h
  143.         mov p9vbuf1,ebp
  144.         add ebp,8000h
  145.         mov p9vbuf2,ebp
  146.  
  147.         mov dx,3d4h
  148.         mov al,0ch
  149.         out dx,al
  150.  
  151. ;-----------------------------------------------------------------------------
  152. part9ml:
  153.         call p9seq
  154.  
  155.         movzx ebx,p9index               ; switch pages, clear old matrix buf
  156.         xor bl,1
  157.         mov p9index,bl
  158.         movzx edi,p9page
  159.         shl edi,8
  160.         add edi,vgaptr
  161.         mov p9pageptr,edi
  162.         mov ebp,p9oldmatrix[ebx*4]
  163.         mov p9oldmatrixptr,ebp
  164.         xor ah,ah
  165.         call _vputedgebuf
  166.         call _vclearedgebuf
  167.         mov esi,p9oldstarbuf[ebx*4]     ; clear old star buffer
  168.         mov p9oldstarptr,esi
  169.         movzx ecx,byte ptr [esi]
  170.         jecxz short part9f0
  171.         inc esi
  172.         mov dx,3c5h
  173.         mov al,0fh
  174.         out dx,al
  175. part9l1:
  176.         movzx eax,word ptr [esi]
  177.         add esi,2
  178.         mov byte ptr [edi+eax],0
  179.         loop part9l1
  180. part9f0:
  181.  
  182.         mov edx,offset p9cuberot        ; set cube rotation
  183.         call part9rotate
  184.  
  185.         mov esi,p9cubeptr               ; rotate and put cube to main buffer
  186.         mov edi,p9vectptr
  187.         xor eax,eax
  188.         push eax
  189.         push ax
  190.         mov ax,8
  191.         push ax
  192.         call _rotate0
  193.  
  194.         mov edx,offset p9vectrot        ; set main rotation and translation
  195.         call part9rotate
  196.         mov eax,dword ptr p9vectoff[6]
  197.         add p9vectoff,ax
  198.         shr eax,16
  199.         add p9vectoff[2],ax
  200.         mov ax,p9vectoff[10]
  201.         add p9vectoff[4],ax
  202.         mov ax,p9distance[2]
  203.         add p9distance,ax
  204.         xor eax,eax
  205.         mov dword ptr p9vectrot[6],eax
  206.         mov word ptr p9vectrot[10],ax
  207.         mov dword ptr p9vectoff[6],eax
  208.         mov word ptr p9vectoff[10],ax
  209.         mov p9distance[2],ax
  210.  
  211.         mov esi,p9starptr               ; rotate stars
  212.         mov edi,p9vbuf0
  213.         mov ax,512
  214.         push ax
  215.         xor eax,eax
  216.         push eax
  217.         mov ax,P9S
  218.         push ax
  219.         call _rotate0
  220.  
  221.         mov ax,P9S
  222.         push ax
  223.         mov edi,p9oldstarptr            ; put stars normal
  224.         inc edi
  225.         mov esi,p9vbuf0
  226.         mov ebp,p9starcolorz
  227.         mov ebx,p9pageptr
  228. part9l2:
  229.         movsx ecx,word ptr [esi+4]
  230.         cmp ecx,512
  231.         jle short part9l2c
  232.         movsx eax,word ptr [esi+2]
  233.         imul eax,256
  234.         cdq
  235.         idiv ecx
  236.         cmp eax,-100
  237.         jl short part9l2c
  238.         cmp eax,99
  239.         jg short part9l2c
  240.         add eax,100
  241.         shl eax,4
  242.         lea eax,[eax*4+eax]
  243.         mov [edi],ax
  244.         movsx eax,word ptr [esi]
  245.         imul eax,256
  246.         cdq
  247.         idiv ecx
  248.         cmp eax,-160
  249.         jl short part9l2c
  250.         cmp eax,159
  251.         jg short part9l2c
  252.         add eax,160
  253.         mov cl,al
  254.         shr eax,2
  255.         add [edi],ax
  256.         and cl,3
  257.         mov al,1
  258.         shl al,cl
  259.         mov dx,3c5h
  260.         out dx,al
  261.         movzx eax,word ptr [edi]
  262.         mov cl,[ebp]
  263.         mov byte ptr [ebx+eax],cl
  264.         inc byte ptr [esp+1]
  265.         add edi,2
  266. part9l2c:
  267.         inc ebp
  268.         add esi,6
  269.         dec byte ptr [esp]
  270.         jnz part9l2
  271.         mov al,P9S                      ; put stars reversed (double)
  272.         mov [esp],al
  273.         sub esi,P9S*6
  274.         sub ebp,P9S
  275. part9lc:
  276.         movsx ecx,word ptr [esi+4]
  277.         sub ecx,1024
  278.         neg ecx
  279.         cmp ecx,512
  280.         jle short part9lcc
  281.         movsx eax,word ptr [esi+2]
  282.         neg eax
  283.         imul eax,256
  284.         cdq
  285.         idiv ecx
  286.         cmp eax,-100
  287.         jl short part9lcc
  288.         cmp eax,99
  289.         jg short part9lcc
  290.         add eax,100
  291.         shl eax,4
  292.         lea eax,[eax*4+eax]
  293.         mov [edi],ax
  294.         movsx eax,word ptr [esi]
  295.         neg eax
  296.         imul eax,256
  297.         cdq
  298.         idiv ecx
  299.         cmp eax,-160
  300.         jl short part9lcc
  301.         cmp eax,159
  302.         jg short part9lcc
  303.         add eax,160
  304.         mov cl,al
  305.         shr eax,2
  306.         add [edi],ax
  307.         and cl,3
  308.         mov al,1
  309.         shl al,cl
  310.         mov dx,3c5h
  311.         out dx,al
  312.         movzx eax,word ptr [edi]
  313.         mov cl,[ebp]
  314.         xor cl,7
  315.         mov byte ptr [ebx+eax],cl
  316.         inc byte ptr [esp+1]
  317.         add edi,2
  318. part9lcc:
  319.         inc ebp
  320.         add esi,6
  321.         dec byte ptr [esp]
  322.         jnz part9lc
  323.         mov al,[esp+1]
  324.         mov edi,p9oldstarptr
  325.         stosb
  326.         add esp,2
  327.  
  328.         mov esi,p9vectptr               ; rotate main points
  329.         mov edi,p9vbuf0
  330.         mov ax,P9P
  331.         push ax
  332.         call part9rotate0
  333.  
  334.         sub esp,11                      ; clip to Z
  335.         mov byte ptr [esp],P9F
  336.         mov p9facetnum,0
  337.         mov esi,p9vbuf1
  338.         mov ebp,p9facetptr
  339. part9la:
  340.         mov [esp+2],ebp
  341.         mov edi,esi
  342.         mov ah,[ebp]
  343.         xor al,al
  344.         stosw
  345.         movzx ebx,ah
  346.         add ebp,2
  347.         movzx eax,byte ptr [ebp+ebx-1]
  348.         mov [esp+1],al
  349.         lea eax,[eax*2+eax]
  350.         lea eax,[eax*2+4]
  351.         add eax,p9vbuf0
  352.         cmp word ptr [eax],P9C-1
  353.         setg bl
  354. part9lb:
  355.         movzx ecx,byte ptr [ebp]
  356.         lea ecx,[ecx*2+ecx]
  357.         shl ecx,1
  358.         add ecx,p9vbuf0
  359.         mov ax,[ecx+4]
  360.         cmp ax,P9C-1
  361.         setg bh
  362.         xor bl,bh
  363.         jz short part9lbc
  364.  
  365.         mov [esp+6],bh
  366.         mov [esp+7],esi
  367.         movzx esi,byte ptr [esp+1]
  368.         lea esi,[esi*2+esi]
  369.         shl esi,1
  370.         add esi,p9vbuf0
  371.         mov ebx,P9C
  372.         sub bx,ax
  373.         jns short part9f4
  374.         neg bx
  375. part9f4:
  376.         shl ebx,16
  377.         sub ax,[esi+4]
  378.         jns short part9f3
  379.         neg ax
  380. part9f3:
  381.         shrd ebx,eax,16
  382.  
  383.         mov ax,[esi]
  384.         sub ax,[ecx]
  385.         imul bx
  386.         rol ebx,16
  387.         idiv bx
  388.         rol ebx,16
  389.         add ax,[ecx]
  390.         stosw
  391.         mov ax,[esi+2]
  392.         sub ax,[ecx+2]
  393.         imul bx
  394.         rol ebx,16
  395.         idiv bx
  396.         add ax,[ecx+2]
  397.         stosw
  398.         mov ax,P9C
  399.         stosw
  400.  
  401.         mov esi,[esp+7]
  402.         inc byte ptr [esi]
  403.         mov bh,[esp+6]
  404. part9lbc:
  405.         mov bl,bh
  406.         or bl,bl
  407.         jz short part9lbc2
  408.         mov eax,[ecx]
  409.         stosd
  410.         mov ax,[ecx+4]
  411.         stosw
  412.         inc byte ptr [esi]
  413. part9lbc2:
  414.         mov al,[ebp]
  415.         inc ebp
  416.         mov [esp+1],al
  417.         dec byte ptr [esi+1]
  418.         jnz part9lb
  419.  
  420.         mov ebp,[esp+2]
  421.         cmp byte ptr [esi],0
  422.         je short part9lac
  423.  
  424.         mov al,[ebp+1]
  425.         mov [esi+1],al
  426.         mov esi,edi
  427.         inc p9facetnum
  428. part9lac:
  429.         movzx eax,byte ptr [ebp]
  430.         lea ebp,[ebp+eax+2]
  431.         dec byte ptr [esp]
  432.         jnz part9la
  433.         add esp,11
  434.  
  435.         mov ebp,p9vbuf1                 ; sort by distance
  436.         movzx eax,p9facetnum
  437.         or al,al
  438.         jz part9f1
  439.         push eax
  440.         mov ebx,p9vbuf2
  441.         mov word ptr [ebx+6],-1
  442. part9l3:
  443.         lea esi,[ebp+2]
  444.         movzx ecx,byte ptr [ebp]
  445.         xor eax,eax
  446.         mov ebx,eax
  447.         mov edi,eax
  448. part9l4:
  449.         movsx edx,word ptr [esi]
  450.         add eax,edx
  451.         movsx edx,word ptr [esi+2]
  452.         add edi,edx
  453.         movzx edx,word ptr [esi+4]
  454.         add ebx,edx
  455.         add esi,6
  456.         loop part9l4
  457.         movzx ecx,byte ptr [ebp]
  458.         or eax,eax
  459.         jns short part9f5
  460.         neg eax
  461. part9f5:
  462.         xor edx,edx
  463.         div ecx
  464.         xchg eax,edi
  465.         or eax,eax
  466.         jns short part9f6
  467.         neg eax
  468. part9f6:
  469.         xor edx,edx
  470.         div ecx
  471.         add edi,eax
  472.         shr edi,2
  473.         mov eax,ebx
  474.         xor edx,edx
  475.         div ecx
  476.         add eax,edi
  477.  
  478.         movzx edi,byte ptr [esp+1]      ;  insert into linked list
  479.         mov ebx,edi
  480.         shl edi,3
  481.         mov edx,p9vbuf2
  482.         add edi,edx
  483.         mov [edi+2],ebp
  484.         mov [edi],ax
  485.         lea ecx,[ecx*2+ecx]
  486.         shl ecx,1
  487.         lea ebp,[ebp+ecx+2]
  488.         mov ecx,ebx
  489.         jecxz short part9l3c
  490.         mov bh,[esp+3]
  491.         movzx esi,bh
  492. part9l5:
  493.         shl esi,3
  494.         add esi,edx
  495.         cmp ax,[esi]
  496.         jb short part9l5c
  497.         movzx eax,byte ptr [esi+7]
  498.         mov [esi+7],bl
  499.         cmp al,-1
  500.         jne short part9l5d
  501.         mov [esp+3],bl
  502.         mov [edi+7],al
  503.         jmp short part9f2
  504. part9l5c:
  505.         mov bh,[esi+6]
  506.         movzx esi,bh
  507.         loop part9l5
  508.         movzx eax,byte ptr [esp+2]
  509.         mov [esp+2],bl
  510.         mov bh,-1
  511. part9l5d:
  512.         mov [edi+7],al
  513.         shl eax,3
  514.         add edx,eax
  515.         mov [edx+6],bl
  516. part9f2:
  517.         mov byte ptr [edi+6],bh
  518. part9l3c:
  519.         inc byte ptr [esp+1]
  520.         dec byte ptr [esp]
  521.         jnz part9l3
  522.         movzx eax,byte ptr [esp+3]
  523.         add esp,4
  524.  
  525.         mov edi,p9vbuf0                 ; project
  526. part9l6:
  527.         lea ebp,[eax*8]
  528.         add ebp,p9vbuf2
  529.         mov esi,[ebp+2]
  530.         lodsw
  531.         movzx ecx,al
  532.         stosw
  533. part9l7:
  534.         movsx ebx,word ptr [esi+4]
  535.         movsx eax,word ptr [esi]
  536.         imul eax,P9R
  537.         cdq
  538.         idiv ebx
  539.         stosw
  540.         movsx eax,word ptr [esi+2]
  541.         imul eax,P9R
  542.         cdq
  543.         idiv ebx
  544.         stosw
  545.         add esi,6
  546.         loop part9l7
  547.         movzx eax,byte ptr [ebp+6]
  548.         cmp al,-1
  549.         jne part9l6
  550.  
  551.         mov ebp,p9matrix                ; draw visible surfaces
  552.         mov esi,p9vbuf0
  553.         mov al,p9facetnum
  554.         push ax
  555. part9l8:
  556.         movsx ecx,word ptr [esi+2+4]
  557.         movsx edx,word ptr [esi+2+4+2]
  558.         movsx edi,word ptr [esi+2+2]
  559.         sub edi,edx
  560.         neg edi
  561.         movsx eax,word ptr [esi+2+8]
  562.         sub eax,ecx
  563.         imul edi,eax
  564.         movsx ebx,word ptr [esi+2]
  565.         sub ecx,ebx
  566.         movsx eax,word ptr [esi+2+8+2]
  567.         sub eax,edx
  568.         imul eax,ecx
  569.         cmp eax,edi
  570.         jge short part9l8c
  571.  
  572.         call _vclearedgebuf
  573.         movzx eax,byte ptr [esi]
  574.         mov [esp+1],al
  575.         shl eax,2
  576.         lea edi,[esi+2]
  577.         mov bx,[edi+eax-2]
  578.         mov ax,[edi+eax-4]
  579. part9l9:
  580.         mov cx,[edi]
  581.         mov dx,[edi+2]
  582.         call _vputedge
  583.         mov ax,cx
  584.         mov bx,dx
  585.         add edi,4
  586.         dec byte ptr [esp+1]
  587.         jnz part9l9
  588.         mov edi,p9oldmatrixptr
  589.         call _vaddedgebuf
  590.         mov edi,p9pageptr
  591.         mov ah,[esi+1]
  592.         call _vputedgebuf
  593. part9l8c:
  594.         movzx eax,byte ptr [esi]
  595.         shl eax,2
  596.         lea esi,[esi+eax+2]
  597.         dec byte ptr [esp]
  598.         jnz part9l8
  599.         add esp,2
  600.  
  601. part9f1:
  602.         call p9phadein0
  603.  
  604.         mov dx,3dah
  605.         in al,dx
  606.         test al,8
  607.         jnz short $-3
  608.  
  609.         mov dx,3d5h                     ; set new page
  610.         mov al,p9page
  611.         out dx,al
  612.         xor al,40h
  613.         mov p9page,al
  614. part9l0:
  615.         cmp _dfmcounter,2
  616.         jb short part9l0
  617.         mov _dfmcounter,0
  618.         mov dx,3dah
  619.         in al,dx
  620.         test al,8
  621.         jz short $-3
  622.         cmp _escpressed,0
  623.         jne _ret
  624.         jmp p9phadein1
  625.  
  626. ;-----------------------------------------------------------------------------
  627. part9rotate:
  628.         mov esi,p9sincosptr
  629.         mov edi,offset srx
  630.         mov ecx,3
  631. part9rotateml:
  632.         movzx ebx,word ptr [edx]
  633.         movsx eax,word ptr [edx+6]
  634.         add ebx,eax
  635.         and ebx,1ffh
  636.         mov [edx],bx
  637.         add edx,2
  638.         movsx eax,word ptr [esi+ebx*2+256]
  639.         mov [edi+12],eax
  640.         movsx eax,word ptr [esi+ebx*2]
  641.         stosd
  642.         loop part9rotateml
  643.         ret
  644.  
  645. ;-----------------------------------------------------------------------------
  646. part9phadein0:
  647.         mov edi,_lomembase
  648.         lea esi,[edi+20h*3]
  649.         mov ecx,8*3
  650.         lea edi,[esi+ecx]
  651.         mov bl,4
  652.         call _slidebytes
  653.         setc al
  654.         mov p9phadeind,al
  655.         jnc _ret
  656.         mov p9phadein0,offset _ret
  657.         ret
  658. ;-----------------------------------------------------------------------------
  659. part9phadein1:
  660.         mov edx,_lomembase
  661.         add edx,28h*3
  662.         mov ecx,8
  663.         mov al,20h
  664.         call _setpal
  665.         cmp p9phadeind,0
  666.         je part9ml
  667.         mov p9phadein1,offset part9ml
  668.         jmp part9ml
  669.  
  670. ;-----------------------------------------------------------------------------
  671. part9delay:
  672.         dec p9delay
  673.         jnz _ret
  674.         mov p9seq,offset part9sequence
  675.         ret
  676.  
  677. ;-----------------------------------------------------------------------------
  678. part9move:
  679.         dec p9delay
  680.         jnz short part9movef0
  681.         mov esi,p9moveparms
  682.         mov edi,offset p9vectoff
  683.         movsd
  684.         movsw
  685.         mov edi,offset p9vectrot
  686.         movsd
  687.         movsw
  688.         lodsw
  689.         mov p9distance,ax
  690.         mov p9seq,offset part9sequence
  691.         ret
  692. part9movef0:
  693.         xor ebp,ebp
  694.         mov esi,offset p9move
  695.         mov edi,offset p9vectoff+6
  696.         mov al,p9movebyte[ebp]
  697.         mov part9mover0m0[1],al
  698.         call part9mover0
  699.         mov al,p9movebyte[ebp]
  700.         mov part9mover0m0[1],al
  701.         call part9mover0
  702.         mov al,p9movebyte[ebp]
  703.         mov part9mover0m0[1],al
  704.         call part9mover0
  705.         mov edi,offset p9vectrot+6
  706.         mov al,p9movebyte[ebp]
  707.         mov part9mover0m0[1],al
  708.         call part9mover0
  709.         mov al,p9movebyte[ebp]
  710.         mov part9mover0m0[1],al
  711.         call part9mover0
  712.         mov al,p9movebyte[ebp]
  713.         mov part9mover0m0[1],al
  714.         call part9mover0
  715.         mov edi,offset p9distance+2
  716.         mov al,p9movebyte[ebp]
  717.         mov part9mover0m0[1],al
  718. part9mover0:
  719.         lodsw
  720.         mov cx,p9count[ebp*2]
  721.         sub cx,p9countdec[ebp*2]
  722.         ja short part9mover0f0
  723.         add cx,p9movelen
  724.         stc
  725. part9mover0f0:
  726. part9mover0m0   db      66h,?,0,0
  727.         mov p9count[ebp*2],cx
  728.         stosw
  729.         inc ebp
  730.         ret
  731.  
  732. ;-----------------------------------------------------------------------------
  733. part9sequence:
  734.         mov esi,p9seqptr
  735.         lodsw
  736.         cmp ax,0
  737.         jl part9done
  738.         jg part9sequencef0
  739.         lodsw
  740.         mov p9delay,ax
  741.         mov p9seq,offset part9delay
  742.         mov p9seqptr,esi
  743.         ret
  744. part9sequencef0:
  745.         mov p9moveparms,esi
  746.         mov p9delay,ax
  747.         mov p9movelen,ax
  748.         mov ebx,eax
  749.         xor ebp,ebp
  750.         lodsw
  751.         sub ax,p9vectoff
  752.         call part9sequencer0
  753.         lodsw
  754.         sub ax,p9vectoff[2]
  755.         call part9sequencer0
  756.         lodsw
  757.         sub ax,p9vectoff[4]
  758.         call part9sequencer0
  759.         mov edi,offset p9vectrot
  760.         call part9sequencer1
  761.         call part9sequencer1
  762.         call part9sequencer1
  763.         lodsw
  764.         sub ax,p9distance
  765.         call part9sequencer0
  766.         mov p9seq,offset part9move
  767.         mov p9seqptr,esi
  768.         jmp part9move
  769. part9sequencer1:
  770.         lodsw
  771.         sub ax,[edi]
  772.         add edi,2
  773.         and ax,1ffh
  774.         cmp ax,100h
  775.         jb short part9sequencer0
  776.         xor ax,1ffh
  777.         neg ax
  778. part9sequencer0:
  779.         mov p9count[ebp*2],bx
  780.         cwd
  781.         idiv bx
  782.         mov p9move[ebp*2],ax
  783.         mov al,15h
  784.         or dx,dx
  785.         jns short part9sequencer0f0
  786.         neg dx
  787.         mov al,1dh
  788. part9sequencer0f0:
  789.         mov p9countdec[ebp*2],dx
  790.         mov p9movebyte[ebp],al
  791.         inc ebp
  792.         ret
  793.  
  794. ;-----------------------------------------------------------------------------
  795. part9done:
  796.         add esp,4
  797.         jmp phadeout
  798.  
  799.  
  800. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  801. ; Rotate set of X,Y,Z coordinates
  802. ; In:
  803. ;   w[esp] - number of points in matrix
  804. ;   w[esp+2] - delta X
  805. ;   w[esp+4] - delta Y
  806. ;   w[esp+6] - delta Z
  807. ;   ESI -> X,Y,Z matrix (words)
  808. ;   EDI -> where to store rotated matrix
  809. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  810. srx             dd      ?               ; sin of rotation around x
  811. sry             dd      ?               ; sin of rotation around y
  812. srz             dd      ?               ; sin of rotation around z
  813. crx             dd      ?               ; cos of rotation around x
  814. cry             dd      ?               ; cos of rotation around y
  815. crz             dd      ?               ; cos of rotation around z
  816. _rotate0:
  817.         pushad
  818. rotate0ml:
  819.         movsx ecx,word ptr [esi]
  820.         mov eax,ecx
  821.         imul eax,crz
  822.         sar eax,9
  823.         movsx edx,word ptr [esi+2]
  824.         mov ebx,edx
  825.         imul ebx,srz
  826.         sar ebx,9
  827.         sub eax,ebx
  828.         imul ecx,srz
  829.         sar ecx,9
  830.         imul edx,crz
  831.         sar edx,9
  832.         add ecx,edx
  833.         movsx ebp,word ptr [esi+4]
  834.         mov ebx,ecx
  835.         imul ebx,crx
  836.         sar ebx,9
  837.         mov edx,ebp
  838.         imul edx,srx
  839.         sar edx,9
  840.         sub ebx,edx
  841.         imul ecx,srx
  842.         sar ecx,9
  843.         imul ebp,crx
  844.         sar ebp,9
  845.         add ebp,ecx
  846.         mov edx,ebp
  847.         imul edx,cry
  848.         sar edx,9
  849.         mov ecx,eax
  850.         imul ecx,sry
  851.         sar ecx,9
  852.         sub edx,ecx
  853.         imul ebp,sry
  854.         sar ebp,9
  855.         imul eax,cry
  856.         sar eax,9
  857.         add eax,ebp
  858.         add ax,[esp+38]
  859.         add bx,[esp+40]
  860.         add dx,[esp+42]
  861.         stosw
  862.         mov [edi],bx
  863.         mov [edi+2],dx
  864.         add edi,4
  865.         add esi,6
  866.         dec word ptr [esp+36]
  867.         jnz rotate0ml
  868.         popad
  869.         ret 8
  870.  
  871. ;─────────────────────────────────────────────────────────────────────────────
  872. part9rotate0:
  873.         mov cx,word ptr [esi]
  874.         add cx,p9vectoff
  875.         movsx ecx,cx
  876.         mov eax,ecx
  877.         imul eax,crz
  878.         sar eax,9
  879.         mov dx,word ptr [esi+2]
  880.         add dx,p9vectoff[2]
  881.         movsx edx,dx
  882.         mov ebx,edx
  883.         imul ebx,srz
  884.         sar ebx,9
  885.         sub eax,ebx
  886.         imul ecx,srz
  887.         sar ecx,9
  888.         imul edx,crz
  889.         sar edx,9
  890.         add ecx,edx
  891.         mov bp,word ptr [esi+4]
  892.         add bp,p9vectoff[4]
  893.         movsx ebp,bp
  894.         mov ebx,ecx
  895.         imul ebx,crx
  896.         sar ebx,9
  897.         mov edx,ebp
  898.         imul edx,srx
  899.         sar edx,9
  900.         sub ebx,edx
  901.         imul ecx,srx
  902.         sar ecx,9
  903.         imul ebp,crx
  904.         sar ebp,9
  905.         add ebp,ecx
  906.         mov edx,ebp
  907.         imul edx,cry
  908.         sar edx,9
  909.         mov ecx,eax
  910.         imul ecx,sry
  911.         sar ecx,9
  912.         sub edx,ecx
  913.         imul ebp,sry
  914.         sar ebp,9
  915.         imul eax,cry
  916.         sar eax,9
  917.         add eax,ebp
  918.         add dx,p9distance
  919.         stosw
  920.         mov [edi],bx
  921.         mov [edi+2],dx
  922.         add edi,4
  923.         add esi,6
  924.         dec word ptr [esp+4]
  925.         jnz part9rotate0
  926.         ret 2
  927.  
  928. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  929. ; Initialize edge buffer
  930. ; In:
  931. ;   EBP -> edge buffer
  932. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  933. _vinitedgebuf:
  934.         mov dword ptr [ebp],0c70000h
  935. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  936. ; Clear edge buffer
  937. ; In:
  938. ;   EBP -> edge buffer
  939. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  940. _vclearedgebuf:
  941.         push eax
  942.         push ecx
  943.         push edi
  944.         movzx edi,word ptr [ebp]
  945.         movzx ecx,word ptr [ebp+2]
  946.         sub ecx,edi
  947.         jc short clearedgebufd
  948.         inc ecx
  949.         lea edi,[ebp+edi*4+4]
  950.         mov dword ptr [ebp],0ffffh
  951.         mov eax,080007fffh
  952.         rep stosd
  953. clearedgebufd:
  954.         pop edi
  955.         pop ecx
  956.         pop eax
  957.         ret
  958.  
  959. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  960. ; Put edge buffer to screen
  961. ; In:
  962. ;   AH - color
  963. ;   EBP -> edge buffer
  964. ;   EDI -> beginning of physical screen memory
  965. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  966. _vputedgebuf:
  967.         pushad
  968.         movzx ebx,word ptr [ebp]
  969.         movzx esi,word ptr [ebp+2]
  970.         sub esi,ebx
  971.         jc putedgebufd
  972.         inc esi
  973.         lea ebp,[ebp+ebx*4+4]
  974.         imul ebx,80
  975.         add edi,ebx
  976.         push edi
  977. putedgebufml:
  978.         movsx ecx,word ptr [ebp]
  979.         cmp ecx,159
  980.         jg putedgebufmlc
  981.         movsx ebx,word ptr [ebp+2]
  982.         cmp ebx,-160
  983.         jl short putedgebufmlc
  984.         cmp ecx,-160
  985.         jge short putedgebuff0
  986.         mov ecx,-160
  987. putedgebuff0:
  988.         cmp ebx,159
  989.         jle short putedgebuff1
  990.         mov ebx,159
  991. putedgebuff1:
  992.         sub ebx,ecx
  993.         inc ebx
  994.         add ecx,160
  995.         mov al,cl
  996.         and al,3
  997.         shr ecx,2
  998.         add edi,ecx
  999.  
  1000.         mov dx,3c5h
  1001.         movzx ecx,al
  1002.         or cl,cl
  1003.         jz short putrasterf0
  1004.         mov al,0fh
  1005.         shl al,cl
  1006.         xor cl,3
  1007.         inc cl
  1008.         sub bx,cx
  1009.         jc short putrasterf2
  1010.         out dx,al
  1011.         mov al,ah
  1012.         stosb
  1013. putrasterf0:
  1014.         cmp bx,4
  1015.         jb short putrasterf1
  1016.         mov al,0fh
  1017.         out dx,al
  1018.         movzx ecx,bx
  1019.         and cl,0fch
  1020.         sub bx,cx
  1021.         shr ecx,2
  1022.         mov al,ah
  1023.         rep stosb
  1024. putrasterf1:
  1025.         mov cl,bl
  1026.         mov al,0f0h
  1027.         rol al,cl
  1028.         out dx,al
  1029.         mov [edi],ah
  1030.         jmp short putedgebufmlc
  1031. putrasterf2:
  1032.         mov cl,bl
  1033.         add cl,4
  1034.         mov bl,0fh
  1035.         shl bl,cl
  1036.         xor al,bl
  1037.         out dx,al
  1038.         mov [edi],ah
  1039.  
  1040. putedgebufmlc:
  1041.         mov edi,[esp]
  1042.         add edi,80
  1043.         mov [esp],edi
  1044.         add ebp,4
  1045.         dec esi
  1046.         jnz putedgebufml
  1047.         add esp,4
  1048. putedgebufd:
  1049.         popad
  1050.         ret
  1051.  
  1052. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  1053. ; Add one edge buffer to another
  1054. ; In:
  1055. ;   EBP -> source edge buffer
  1056. ;   EDI -> destination edge buffer
  1057. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  1058. _vaddedgebuf:
  1059.         push eax
  1060.         push ecx
  1061.         push esi
  1062.         push edi
  1063.         movzx ecx,word ptr [ebp+2]
  1064.         cmp cx,[edi+2]
  1065.         jb short addedgebuff1
  1066.         mov [edi+2],cx
  1067. addedgebuff1:
  1068.         movzx eax,word ptr [ebp]
  1069.         cmp ax,[edi]
  1070.         ja short addedgebuff0
  1071.         mov [edi],ax
  1072. addedgebuff0:
  1073.         sub ecx,eax
  1074.         jc short addedgebufd
  1075.         inc ecx
  1076.         lea esi,[ebp+eax*4+4]
  1077.         lea edi,[edi+eax*4+4]
  1078. addedgebufml:
  1079.         lodsw
  1080.         cmp ax,[edi]
  1081.         jg short addedgebufmlf0
  1082.         mov [edi],ax
  1083. addedgebufmlf0:
  1084.         add edi,2
  1085.         lodsw
  1086.         cmp ax,[edi]
  1087.         jl short addedgebufmlf1
  1088.         mov [edi],ax
  1089. addedgebufmlf1:
  1090.         add edi,2
  1091.         loop addedgebufml
  1092. addedgebufd:
  1093.         pop edi
  1094.         pop esi
  1095.         pop ecx
  1096.         pop eax
  1097.         ret
  1098.  
  1099. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  1100. ; Put edge line to edge buffer
  1101. ; In:
  1102. ;   AX - starting X
  1103. ;   BX - starting Y
  1104. ;   CX - ending X
  1105. ;   DX - ending Y
  1106. ;   EBP -> edge buffer
  1107. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  1108. ;-----------------------------------------------------------------------------
  1109. putedgef0:
  1110.         cmp bp,-100
  1111.         jl putedgedone
  1112.         sub cx,ax
  1113.         mov ax,-100
  1114.         sub ax,bx
  1115.         jns short putedgef0f0
  1116.         neg ax
  1117. putedgef0f0:
  1118.         sub bx,bp
  1119.         jns short putedgef0f1
  1120.         neg bx
  1121. putedgef0f1:
  1122.         imul cx
  1123.         idiv bx
  1124.         add si,ax
  1125.         mov bx,-100
  1126.         jmp putedgef4
  1127. ;-----------------------------------------------------------------------------
  1128. putedgef1:
  1129.         cmp bp,99
  1130.         jg putedgedone
  1131.         sub cx,ax
  1132.         mov ax,99
  1133.         sub ax,bx
  1134.         jns short putedgef1f0
  1135.         neg ax
  1136. putedgef1f0:
  1137.         sub bx,bp
  1138.         jns short putedgef1f1
  1139.         neg bx
  1140. putedgef1f1:
  1141.         imul cx
  1142.         idiv bx
  1143.         add si,ax
  1144.         mov bx,99
  1145.         jmp short putedgef4
  1146. ;-----------------------------------------------------------------------------
  1147. putedgef2:
  1148.         mov cx,si
  1149.         sub cx,di
  1150.         mov ax,-100
  1151.         sub ax,bp
  1152.         jns short putedgef2f0
  1153.         neg ax
  1154. putedgef2f0:
  1155.         sub bp,bx
  1156.         jns short putedgef2f1
  1157.         neg bp
  1158. putedgef2f1:
  1159.         imul cx
  1160.         idiv bp
  1161.         add di,ax
  1162.         mov bp,-100
  1163.         jmp short putedgef5
  1164. ;-----------------------------------------------------------------------------
  1165. putedgef3:
  1166.         mov cx,si
  1167.         sub cx,di
  1168.         mov ax,99
  1169.         sub ax,bp
  1170.         jns short putedgef3f0
  1171.         neg ax
  1172. putedgef3f0:
  1173.         sub bp,bx
  1174.         jns short putedgef3f1
  1175.         neg bp
  1176. putedgef3f1:
  1177.         imul cx
  1178.         idiv bp
  1179.         add di,ax
  1180.         mov bp,99
  1181.         jmp short putedgef5
  1182.  
  1183. ;═════════════════════════════════════════════════════════════════════════════
  1184. _vputedge:
  1185.         pushad
  1186.         mov si,ax
  1187.         mov di,cx
  1188.         mov bp,dx
  1189.         cmp bx,-100
  1190.         jl putedgef0
  1191.         cmp bx,99
  1192.         jg putedgef1
  1193. putedgef4:
  1194.         cmp bp,-100
  1195.         jl putedgef2
  1196.         cmp bp,99
  1197.         jg putedgef3
  1198. putedgef5:
  1199.                 ; Out: SI-X, BX-Y, DI-X, BP-Y
  1200.         add bx,100
  1201.         lea edx,[ebp+100]
  1202.         lea eax,[esi+8000h]
  1203.         lea ecx,[edi+8000h]
  1204.         mov ebp,[esp+8]
  1205.         mov si,bx
  1206.         mov di,bx
  1207.         cmp si,dx
  1208.         jb short oputedgebf5
  1209.         mov si,dx
  1210. oputedgebf5:
  1211.         cmp di,dx
  1212.         ja short oputedgebf6
  1213.         mov di,dx
  1214. oputedgebf6:
  1215.         cmp si,[ebp]
  1216.         ja short oputedgebf0
  1217.         mov [ebp],si
  1218. oputedgebf0:
  1219.         cmp di,[ebp+2]
  1220.         jb short oputedgebf1
  1221.         mov [ebp+2],di
  1222. oputedgebf1:
  1223.         movzx esi,bx
  1224.         lea ebp,[ebp+esi*4+4]
  1225.         sub dx,bx
  1226.         mov bl,0c5h
  1227.         jnc short oputedgebf2
  1228.         neg dx
  1229.         mov bl,0edh
  1230. oputedgebf2:
  1231.         mov oputedgem1[1],bl
  1232.         mov edgely,dx
  1233.         sub cx,ax
  1234.         mov bl,40h
  1235.         jnc short oputedgebf3
  1236.         neg cx
  1237.         mov bl,48h
  1238. oputedgebf3:
  1239.         mov oputedgem0,bl
  1240.         mov edgelx,cx
  1241.         cmp cx,dx
  1242.         ja short oputedgebf4
  1243.         mov cx,dx
  1244. oputedgebf4:
  1245.         movzx ebx,cx
  1246.         lea ecx,[ebx+1]
  1247.         mov si,bx
  1248.         shr si,1
  1249.         adc si,0
  1250.         mov di,si
  1251.         mov dx,[ebp+2]
  1252.         sub ax,8000h
  1253.         jmp short oputedgeml
  1254. oputedgeml:
  1255.         cmp ax,[ebp]
  1256.         jg short oputedgef0
  1257.         mov [ebp],ax
  1258. oputedgef0:
  1259.         cmp ax,dx
  1260.         jl short oputedgef1
  1261.         mov dx,ax
  1262. oputedgef1:
  1263.         db 66h,81h,0eeh
  1264. edgelx          dw      ?
  1265.         ja short oputedgef2
  1266.         add si,bx
  1267. oputedgem0      db      ?
  1268. oputedgef2:
  1269.         db 66h,81h,0efh
  1270. edgely          dw      ?
  1271.         ja short oputedgef4
  1272.         add di,bx
  1273.         mov [ebp+2],dx
  1274. oputedgem1      db      83h,?,4
  1275.         mov dx,[ebp+2]
  1276. oputedgef4:
  1277.         loop oputedgeml
  1278.         mov [ebp+2],dx
  1279. putedgedone:
  1280.         popad
  1281.         ret
  1282.  
  1283. ; Hey you... Yeah, you reading this message... Ignore this.
  1284. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  1285. ; Square root
  1286. ; In:
  1287. ;   EAX - number to take root of
  1288. ; Out:
  1289. ;   EAX - root
  1290. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  1291. sqrtbasetbl     db      0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225
  1292. _sqrt:
  1293.         pushad
  1294.         mov ebp,eax
  1295.         bsr ebx,eax
  1296.         jnz short sqrtf0
  1297.         xor ebx,ebx
  1298. sqrtf0:
  1299.         shr ebx,3
  1300.         lea eax,[ebx*8]
  1301.         mov cl,32
  1302.         sub cl,al
  1303.         rol ebp,cl
  1304.         mov eax,ebp
  1305.         movzx eax,al
  1306.         mov edi,offset sqrtbasetbl
  1307.         mov ecx,10h
  1308. sqrtl0:
  1309.         scasb
  1310.         je short sqrtl0d
  1311.         jb short sqrtl0d2
  1312.         loop sqrtl0
  1313.         inc edi
  1314. sqrtl0d2:
  1315.         dec edi
  1316.         inc cl
  1317. sqrtl0d:
  1318.         movzx edx,byte ptr [edi-1]
  1319.         dec cl
  1320.         xor cl,0fh
  1321.         mov edi,ecx
  1322.         mov ecx,ebx
  1323.         jecxz short sqrtdone
  1324.         sub eax,edx
  1325. sqrtml:
  1326.         shld eax,ebp,8
  1327.         rol ebp,8
  1328.         mov ebx,edi
  1329.         shl ebx,5
  1330.         xor edx,edx
  1331.         mov esi,eax
  1332.         div ebx
  1333.         rol edi,4
  1334.         add edi,eax
  1335.         add ebx,eax
  1336. sqrtf2:
  1337.         imul eax,ebx
  1338.         mov edx,eax
  1339.         mov eax,esi
  1340.         sub eax,edx
  1341.         jc short sqrtf1
  1342.         loop sqrtml
  1343. sqrtdone:
  1344.         mov [esp+28],edi
  1345.         popad
  1346.         ret
  1347. sqrtf1:
  1348.         dec ebx
  1349.         dec edi
  1350.         movzx eax,bl
  1351.         and al,1fh
  1352.         jmp sqrtf2
  1353.  
  1354.